package com.tim.arc.bytebuddy;

import net.bytebuddy.asm.Advice;
/**环绕切面
 @Advice是ByteBuddy 提供的一组基于注解的方法拦截工具类，运行时动态织入
 @Advice.OnMethodEnter。在目标方法执行之前调用
 @Advice.OnMethodExit。在目标方法执行之后调用（无论是否抛出异常）
 @Advice.AlLArguments。获取所有方法参数数组
 @Advice.Argument（index）。获取指定索引的参数。0开始
 @Advice.This。获取 this 对象（非静态方法）
 @Advice.FieLdValue（fieLd）。获取字段值
 @Advice.Return。获取返回值（仅在OnMethodExit中有效）
 @Advice.Thrown。获取异常对象（仅在OnMethodExit中有效）
 @Advice.Origin。获取目标方法的签名字符串或Method实例
 @Advice.LocaL（index）。存储局部变量（用于跨Enter/Exit 传递数据）
 @Advice.Enter。获取@Advice.OnMethodEnter方法返回值

 * */
public class FooToStringRedefine {

    /*返回值为String，不执行原方法；为String，执行原方法*/
    @Advice.OnMethodEnter(skipOn = String.class)
    public static Object onMethodEnter(){
        return "1";
    }

    @Advice.OnMethodExit
    public static void onMethodExit(
            @Advice.Return(readOnly = false) String result
    ){
        result="onMethodExit";
    }
}
